home *** CD-ROM | disk | FTP | other *** search
/ Download Now 8 / Download Now V8.iso / Program / InternetTools / ApacheWebServer1.3.6 / apache_1_3_6_win32.exe / _SETUP.1 / getopt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-15  |  3.9 KB  |  170 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5.  
  6. #ifdef WIN32
  7.  
  8. #define OPTERRCOLON (1)
  9. #define OPTERRNF (2)
  10. #define OPTERRARG (3)
  11.  
  12. char *optarg;
  13. int optind = 1;
  14. int opterr = 1;
  15. int optopt;
  16.  
  17. static int
  18. optiserr(int argc, char * const *argv, int oint, const char *optstr,
  19.          int optchr, int err)
  20. {
  21.     if(opterr)
  22.     {
  23.         fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1);
  24.         switch(err)
  25.         {
  26.         case OPTERRCOLON:
  27.             fprintf(stderr, ": in flags\n");
  28.             break;
  29.         case OPTERRNF:
  30.             fprintf(stderr, "option not found %c\n", argv[oint][optchr]);
  31.             break;
  32.         case OPTERRARG:
  33.             fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);
  34.             break;
  35.         default:
  36.             fprintf(stderr, "unknown\n");
  37.             break;
  38.         }
  39.     }
  40.     optopt = argv[oint][optchr];
  41.     return('?');
  42. }
  43.     
  44.    
  45.  
  46. int
  47. getopt(int argc, char* const *argv, const char *optstr)
  48. {
  49.     static int optchr = 0;
  50.     static int dash = 0; /* have already seen the - */
  51.  
  52.     char *cp;
  53.  
  54.     if(optind >= argc)
  55.         return(EOF);
  56.     if(!dash && (argv[optind][0] !=  '-'))
  57.         return(EOF);
  58.     if(!dash && (argv[optind][0] ==  '-') && !argv[optind][1])
  59.     {
  60.         /*
  61.          * use to specify stdin. Need to let pgm process this and
  62.          * the following args
  63.          */
  64.         return(EOF);
  65.     }
  66.     if((argv[optind][0] == '-') && (argv[optind][1] == '-'))
  67.     {
  68.         /* -- indicates end of args */
  69.         optind++;
  70.         return(EOF);
  71.     }
  72.     if(!dash)
  73.     {
  74.         assert((argv[optind][0] == '-') && argv[optind][1]);
  75.         dash = 1;
  76.         optchr = 1;
  77.     }
  78.  
  79.     /* Check if the guy tries to do a -: kind of flag */
  80.     assert(dash);
  81.     if(argv[optind][optchr] == ':')
  82.     {
  83.         dash = 0;
  84.         optind++;
  85.         return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRCOLON));
  86.     }
  87.     if(!(cp = strchr(optstr, argv[optind][optchr])))
  88.     {
  89.         int errind = optind;
  90.         int errchr = optchr;
  91.  
  92.         if(!argv[optind][optchr+1])
  93.         {
  94.             dash = 0;
  95.             optind++;
  96.         }
  97.         else
  98.             optchr++;
  99.         return(optiserr(argc, argv, errind, optstr, errchr, OPTERRNF));
  100.     }
  101.     if(cp[1] == ':')
  102.     {
  103.         dash = 0;
  104.         optind++;
  105.         if(optind == argc)
  106.             return(optiserr(argc, argv, optind-1, optstr, optchr, OPTERRARG));
  107.         optarg = argv[optind++];
  108.         return(*cp);
  109.     }
  110.     else
  111.     {
  112.         if(!argv[optind][optchr+1])
  113.         {
  114.             dash = 0;
  115.             optind++;
  116.         }
  117.         else
  118.             optchr++;
  119.         return(*cp);
  120.     }
  121.     assert(0);
  122.     return(0);
  123. }
  124.  
  125. #endif /* WIN32 */
  126.  
  127. #ifdef TESTGETOPT
  128. int
  129.  main (int argc, char **argv)
  130.  {
  131.       int c;
  132.       extern char *optarg;
  133.       extern int optind;
  134.       int aflg = 0;
  135.       int bflg = 0;
  136.       int errflg = 0;
  137.       char *ofile = NULL;
  138.  
  139.       while ((c = getopt(argc, argv, "abo:")) != EOF)
  140.            switch (c) {
  141.            case 'a':
  142.                 if (bflg)
  143.                      errflg++;
  144.                 else
  145.                      aflg++;
  146.                 break;
  147.            case 'b':
  148.                 if (aflg)
  149.                      errflg++;
  150.                 else
  151.                      bflg++;
  152.                 break;
  153.            case 'o':
  154.                 ofile = optarg;
  155.                 (void)printf("ofile = %s\n", ofile);
  156.                 break;
  157.            case '?':
  158.                 errflg++;
  159.            }
  160.       if (errflg) {
  161.            (void)fprintf(stderr,
  162.                 "usage: cmd [-a|-b] [-o <filename>] files...\n");
  163.            exit (2);
  164.       }
  165.       for ( ; optind < argc; optind++)
  166.            (void)printf("%s\n", argv[optind]);
  167.       return 0;
  168.  }
  169.  
  170. #endif /* TESTGETOPT */